/* SmartPointerI.ipp
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 05/28/2017
 *  Last Modified   : 05/28/2017
 * 
 */

#pragma once
#ifndef ymp_Memory_SmartPointerI_IPP
#define ymp_Memory_SmartPointerI_IPP
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include <utility>
#include "PublicLibs/CompilerSettings.h"
#include "SmartPointerI.h"
namespace ymp{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template <typename Type>
SmartPointerI<Type>::~SmartPointerI(){
    if (m_ptr != nullptr){
        delete m_ptr;
    }
}
template <typename Type>
void SmartPointerI<Type>::clear() noexcept{
    if (m_ptr != nullptr){
        delete m_ptr;
        m_ptr = nullptr;
    }
}
template <typename Type>
template <class... Args>
SmartPointerI<Type>::SmartPointerI(SmartPointerToken, Args&&... args)
    : m_ptr(new Type(std::forward<Args>(args)...))
{}
template <typename Type>
template <class... Args>
void SmartPointerI<Type>::reset(Args&&... args){
    *this = SmartPointerI<Type>(MAKE, std::forward<Args>(args)...);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
#endif
